.\" Copyright 2000 by Damian Ivereigh <damian@cisco.com>
.\"
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\" 
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\" 
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\"
.TH RBOPENLIST 3  "May 23, 2000" "GNU" "Linux Programmer's Manual"
.SH NAME
rbopenlist, rbreadlist, rbcloselist \- read from a red-black tree
.SH SYNOPSIS
.nf
.B #include <redblack.h>
.sp
.BI "RBLIST *rbopenlist ( const struct rbtree *" rb ");"
.sp
.BI "const void *rbreadlist ( RBLIST * " rblp ");"
.sp
.BI "void rbcloselist ( RBLIST * " rblp ");"
.sp
.RE
.fi
.SH DESCRIPTION
\fBrbopenlist\fP, \fBrbreadlist\fP, \fBrbcloselist\fP provide a simple
way to read from a redblack binary tree created by \fBrbinit(3)\fP.
.PP
\fBrbopenlist\fP initialises the list and returns a \fBRBLIST\fP
pointer that is used in subsequent calls to \fBrbreadlist\fP and
\fBrbcloselist\fP.
.PP
\fBrbreadlist\fP returns a pointer to the node data. Each subsequent
call returns the next node in the order specified by the tree.
.PP
\fBrbcloselist\fP simply frees up the memory used to allocate the \fBRBLIST\fP
data pointer.
.PP
.SH "RETURN VALUE"
\fBrbopenlist\fP returns a pointer to the new list structure, \fBNULL\fP
if there was insufficient memory to allocate the structure.
\fBrbreadlist\fP returns the next node data pointer in the tree, \fBNULL\fP
when there are no more entries.
\fBrbcloselist\fP has no return value.
.SH EXAMPLE
The following program inserts twelve random numbers into a binary
tree, then prints the numbers in order. 
.sp
.nf
    #include <redblack.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    void *xmalloc(unsigned n)
    {
        void *p;
        p = malloc(n);
        if(p) return p;
        fprintf(stderr, "insufficient memory\\n");
        exit(1);
    }
    
    int compare(const void *pa, const void *pb, const void *config)
    {
        if(*(int *)pa < *(int *)pb) return -1;
        if(*(int *)pa > *(int *)pb) return 1;
        return 0;
    }
    
    int main()
    {
        int i, *ptr;
        void *val;
        struct rbtree *rb;
        RBLIST *rblist;
    
        srand(getpid());
    
        if ((rb=rbinit(compare, NULL))==NULL)
        {
            fprintf(stderr, "insufficient memory\\n");
            exit(1);
        }
    
        for (i = 0; i < 12; i++)
        {
            ptr = (int *)xmalloc(sizeof(int));
            *ptr = rand()&0xff;
            val = rbsearch((void *)ptr, rb);
            if(val == NULL) exit(1);
        }
    
        if ((rblist=rbopenlist(rb))==NULL)
        {
                fprintf(stderr, "insufficient memory from rbopenlist()\\n");
                exit(1);
        }

        while((val=rbreadlist(rblist)))
        {
                printf("%6d\\n", *(int *)val);
        }

        rbcloselist(rblist);

        rbdestroy(rb);
        
        return 0;
    }
.fi
.SH "SEE ALSO"
.BR rbinit (3),
.BR rbgen (1),
.BR tsearch (3).

